Я составляю список контактов из веб-службы и отображаю его в разделенном контактами tableView, как показано на снимке экрана. Проблема в том, что я получаю одинаковые значения тегов для флажков первой строки для раздела A, а также для раздела S. Я отсортировал один массив и отобразил его в виде индексированной таблицы. Как получить разные значения тегов в зависимости от indexPath.row независимо от количества отображаемых разделов. Вот что я пробовал В cellForRowAtIndexPath: UIButton * checkBox; если (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)]; } еще { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // для (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters имеет символы от 'A' до 'Z' //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: самостоятельное действие: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; возвратная ячейка; } - (void) checkBoxClicked: (id) отправитель { CGPoint buttonPosition = [отправитель convertPoint: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) отправитель; NSLog (@ "Номер тега =% d", [тег отправителя]); if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [отправитель setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; если (indexPath! = Nil) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // сохраняем идентификаторы флажков в mutableArrayOfIds NSLog (@ "Tagged selected button id =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } еще { [отправитель setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "Не проверено"); // [arrayOfIds removeObjectAtIndex: tappedButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section { если ([количество символов arrayOfCharacters] == 0) { возвращение @""; } return [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: section]]; } - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; return toBeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) заголовок atIndex: (NSInteger) index { NSInteger count = 0; for (символ NSString * в arrayOfCharacters) { if ([символ isEqualToString: title]) { счетчик возврата; } count ++; } возврат 0; } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { return [количество символов arrayOfCharacters]; // возврат 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) раздел { // return [счетчик mutableArray]; return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: раздел]] счетчик]; }
2020-12-07 22:55:59
вы устанавливаете одно и то же значение тега для всех разделов, имеющих одну и ту же строку. IndexPath имеет два свойства, {раздел, строки}. Давайте скажем раздел А имеет два ряда, для row1 -> indexPath.section = 0, indexPath.row = 0; для row2-> indexPath.section = 0, indexPath.row = 1; Допустим, в разделе S две строки, для row1 -> indexPath.section = 1, indexPath.row = 0; для row2-> indexPath.section = 1, indexPath.row = 1; Итак, для строки 1 раздела A и строки 1 раздела S вы устанавливаете одно и то же значение тега, равное 0. Это ваша проблема. Попробуйте установить значение тега, как показано ниже. button.tag = indexPath.section * 1000 + indexPath.row; при получении раздела и строки, NSInteger section = (button.tag) / 1000; NSInteger row = (button.tag)% 1000; | Попробуй это... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { статический NSString * CellIdentifier = @ "Cell"; UITableViewCell * ячейка = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) { ячейка = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor orangeColor]; [checkBox addTarget: самостоятельное действие: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; возвратная ячейка; } - (void) checkBoxClicked: (id) событие отправителя: (id) событие { NSSet * touch = [событие allTouches]; UITouch * touch = [касается любого объекта]; CGPoint currentTouchPosition = [коснитесь locationInView: self.tv]; // здесь tv - это объект TableView NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "значение indePath.section% D, indexPath.row% D", indexPath.section, indexPath.row); } | Это происходит потому, что вы назначаете теги кнопкам НЕЗАВИСИМО от разделов. Обе строки в первой строке разделов A и S имеют row = 0. Таким образом, тег, назначенный их соответствующей кнопке, равен 0. Вы должны назначить их Сохранение ссылки на ваши разделы. Я хотел бы предложить, чтобы назначить доступность подсказку с разделенной запятой формы, содержащей раздел, строка. И в вашем методе - (void) checkBoxClicked: (id) отправитель { // выбрать строку из разделенной запятой формы. 1-й - ваш раздел, 2-й - ряд. } Второй вариант - делайте то, что вы делаете, и реализуйте свой метод Button следующим образом. CGPoint buttonPosition = [отправитель convertPoint: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; если (indexPath! = ноль) { ... indexpath.section - это ваш раздел, index path.row - это ваша строка. } Есть и третий вариант. в cellforRowAtIndexpath присвоить кнопке название - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Ваша строка #> forState: UIControlStateDisabled]; [btn setTag <# Ваш Раздел #>]; поэтому после получения в вашем методе кнопки вы можете иметь как раздел (тег), так и строку (заголовок для состояния Disabled). - (void) checkBoxClicked: (id) отправитель {[button titleForState: UIControlStateDisabled]; // ваша строка button.tag // ваш раздел} | Попробуй это! Каждая секция может знать количество раздела вправо, затем добавить кол отдельной строки. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row Где fieldTitlesList - это массив ваших разделов. | Я добавил следующий код, который решил мою проблему NSInteger rowNumber = 0; для (NSInteger i = 0; i\ u003cpath d = \" M32.492 10.1419C32.492 12.6954 14.1184.045.492 12.6954 14.1184.0485.492.492 12.6954 14.1184.048.0 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455C35.8209 11.5455 35.462.432355.2455C35.8209 11.5455 35.4622132354 9.8209 35.462.42354 9.8209 35.462.4954 10.85.46.95 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/> \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \" M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30 0,8468 1 4.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.94978 28.1109 5.50789C27.499 4.86533 26.7335 4.50789C27.499 25137533 26.7335 116087 25.7005 4.560132413513.93.98324.013.93.9834.0 21.96.9834.0 13,913 27,4607 13,4902 28,1109 12.6616C28.1109 12,7229 28,1161 12,7799 28,121 12.8346C28.1256 12,8854 28,1301 12,9342 28,1301 12.983C28.1301 14,4373 27,2502 15,2321 25,777 15.2321C24.8349 15,2321 24,1352 14,9821 23,5661 14.7787C23.176 14,6393 22,8472 14,5218 22,5437 14,5218 21,2429 14.5218C21.7977 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM24.1317 9.27932C24.1317 7.94324 24.9928 7.09766 26.1024 7.09766C27.2119 7.09766 28.0918 7.94324 28.0918 9.279.5321176289 26.0918 7.94324 28.0918 9.279.5321126289 26.0918 7.94324 28.0918 9.279.532117628.69.28.98.27.932711628.0 /> \ u003cpath d = \ "M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 13.8962C19.3298 13.8962 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 4.97809 4.8993 7.97623221 5,2665,2666 8,57809 4,89931 7.9762321000 5,2666328 4,6632632000 5,2666326 5,266 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10.893.75123.75 81362.95118.48118.408.92.98 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath3,8662183CPath d16.3162471.4.6327904.6247904,6327904,62327 .791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962 3.31675 13.2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u003c1.8path d = \" 7209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 1.87209 0.400291Z \ s \ u003 \ u003 \ u003 \ u003 \ u003 \ u000 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 > \ u003c / a> ", contentPolicyHtml: "Вклады пользователей под лицензией \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a> \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "> (политика содержания) \ u003c / a>", allowUrls: true }, onDemand: правда, discardSelector: ".discard-answer" , немедленноShowMarkdownHelp: true, enableSnippets: true }); } }); Спасибо за ответ на Stack Overflow! Обязательно ответьте на вопрос. Сообщите подробности и поделитесь своим исследованием! Но избегайте… Просить о помощи, разъяснениях или отвечать на другие ответы. Делать заявления, основанные на мнении; подкрепите их рекомендациями или личным опытом. Чтобы узнать больше, ознакомьтесь с нашими советами по написанию отличных ответов. Черновик сохранен Черновик отклонен Зарегистрируйтесь или войдите под своим ником StackExchange.ready (функция () { StackExchange.helpers.onClickDraftSave ('# ссылка для входа'); }); Зарегистрируйтесь с помощью Google Зарегистрируйтесь через Facebook Зарегистрируйтесь, используя электронную почту и пароль представить Опубликовать как гость название Электронное письмо Обязательно, но не отображается StackExchange.ready ( function () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f21227618% 2fset-button-tag-for-different-section-of-uitableview% 23new-answer' , 'question_page'); } ); Опубликовать как гость название Электронное письмо Обязательно, но не отображается Разместите свой ответ Отменить Нажимая «Опубликовать ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie. Не тот ответ, который вы ищете? Посмотрите другие вопросы с метками ios uitableview или задайте свой вопрос.